package gson.stream.cclass;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.stream.JsonWriter;
import model.User;

import java.io.IOException;
import java.io.StringWriter;

public class JsonWriterExample {
    private JsonWriter writer;
    private StringWriter stringWriter;

    public JsonWriterExample() {
        this.stringWriter = new StringWriter();
        this.writer = new JsonWriter(stringWriter);
    }

    // 获取生成的 JSON 字符串
    public String getJson() {
        return stringWriter.toString();
    }

    // 开始 JSON 对象
    public void beginObject() throws IOException {
        writer.beginObject();
    }

    // 结束 JSON 对象
    public void endObject() throws IOException {
        writer.endObject();
    }

    // 开始 JSON 数组
    public void beginArray() throws IOException {
        writer.beginArray();
    }

    // 结束 JSON 数组
    public void endArray() throws IOException {
        writer.endArray();
    }

    // 写入属性名称
    public JsonWriterExample name(String name) throws IOException {
        writer.name(name);
        return this; // 支持链式调用
    }

    // 写入 String 值
    public JsonWriterExample value(String value) throws IOException {
        writer.value(value);
        return this; // 支持链式调用
    }

    // 写入 boolean 值
    public JsonWriterExample value(boolean value) throws IOException {
        writer.value(value);
        return this; // 支持链式调用
    }

    // 写入 int 值
    public JsonWriterExample value(int value) throws IOException {
        writer.value(value);
        return this; // 支持链式调用
    }

    // 写入 null 值
    public JsonWriterExample nullValue() throws IOException {
        writer.nullValue();
        return this; // 支持链式调用
    }

    // 序列化 User 对象，只序列化 @Expose 注解字段
    public String serializeUser(User user) {
        Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
        return gson.toJson(user);
    }

    // 设置是否序列化 null 值
    public void setSerializeNulls(boolean serializeNulls) {
        writer.setSerializeNulls(serializeNulls);
    }

    // 设置宽松模式
    public void setLenient(boolean lenient) {
        writer.setLenient(lenient);
    }

    // 设置 HTML 安全模式
    public void setHtmlSafe(boolean htmlSafe) {
        writer.setHtmlSafe(htmlSafe);
    }

    // 获取是否为宽松模式
    public boolean isLenient() {
        return writer.isLenient();
    }

    // 获取是否为 HTML 安全模式
    public boolean isHtmlSafe() {
        return writer.isHtmlSafe();
    }
}
